package stack

type Node[V any] struct {
	data V
	next *Node[V]
}

type Stack[V any] struct {
	top *Node[V]
}

func (s *Stack[V]) Push(v V) {
	data := &Node[V]{
		data: v,
	}
	if s.top != nil {
		data.next = s.top
	}
	s.top = data
}

func (s *Stack[V]) Pop() (V, bool) {
	if s.top == nil {
		return V(), false
	}
	data := s.top.data
	s.top = s.top.next
	return data, true
}

func (s *Stack[V]) Peek() (V, bool) {
	if s.top == nil {
		return V(), false
	}
	return s.top.data, true
}

func (s *Stack) IsEmpty() bool {
	return s.top == nil
}
